Skip to main content

Otázka č. 15 - Meziprocesová komunikace

Zadání: vysvětlení pojmu · základní komunikační prostředky + popis · roura, soket, fronta zpráv a vzdálené volání procedur

Co je IPC

IPC (Inter-Process Communication) = výměna dat mezi procesy nebo vlákny.

  • Může probíhat na jednom počítači i mezi počítači v síti.
  • Slouží k efektivnímu využití více jader / procesorů.
  • Umožňuje koordinaci a dělení úloh mezi procesy.

Proč je IPC důležité

  • Umožňuje rozdělit náročné výpočty na více paralelních úloh.
  • Procesy mohou spolupracovat a sdílet výsledky.
  • Zajišťuje efektivní využití výpočetních prostředků.
  • Umožňuje modularitu - systém se dá poskládat z menších samostatných procesů.

Proč to není triviální

  • Každý proces má vlastní logický adresový prostor a správa paměti mu brání sáhnout mimo něj. To je dobře (ochrana), ale znamená to, že si dva procesy nemůžou jen tak předat data ukazatelem - komunikaci musí zprostředkovat jádro.
  • Vlákna jednoho procesu IPC nepotřebují - sdílejí paměť přímo. Potřebují ale synchronizaci (viz otázka č. 14).

Způsoby komunikace

  • Zasílání zpráv (send / receive) - data kopíruje jádro
  • Synchronizace - koordinace pořadí (semafory, mutexy)
  • Sdílená paměť - procesy sdílí stejné rámce
  • Vzdálené volání procedur (RPC)

Dělení podle vlastností

Podle adresace:

  • Přímá - zpráva se posílá konkrétnímu procesu (send(P, zpráva)). Procesy o sobě musí vědět.
  • Nepřímá - zpráva se posílá do schránky / portu, odkud si ji někdo vyzvedne. Odesílatel a příjemce se nemusí znát a jedna schránka může mít víc účastníků.

Podle struktury dat:

  • Proudová (stream) - souvislý sled bajtů bez hranic zpráv (roura, TCP soket)
  • Zprávová (message-based) - přenášejí se oddělené zprávy se zachovanou hranicí (fronta zpráv, UDP)

Podle směru přenosu:

  • jednosměrná (roura, signál)
  • obousměrná (soket, RPC)
  • všesměrová (broadcast, sběrnice zpráv)

Podle rychlosti:

  • Pomalá - signály, fronty zpráv
  • Střední - roury, sokety
  • Rychlá - sdílená paměť

Podle blokování:

  • Blokující (synchronní) - send čeká, dokud zprávu někdo nepřevezme, receive čeká na zprávu (tzv. rendezvous)
  • Neblokující (asynchronní) - operace se vrátí hned, zpráva se uloží do fronty

Komunikační prostředky

1. Soubor

  • Nejsnadnější varianta - jeden proces zapisuje, druhý čte.
  • Používá se dočasný soubor.
  • Nevýhody: bezpečnost (k souboru se dostane kdokoliv s právy), problém se souběžným přístupem (nutné zamykání souboru) a pomalost (jde přes disk).
  • Vylepšením je paměťově mapovaný soubor (mmap) - soubor se namapuje do LAP a pracuje se s ním jako s pamětí.

2. Signály

  • Krátké zprávy mezi procesy ve smyslu „něco se stalo“ - něco jako softwarové přerušení.
  • Nepřenášejí data, jen svoje číslo, tedy pouze notifikaci.
  • Např. SIGINT (Ctrl+C), SIGTERM (slušné ukončení), SIGKILL (nelze odchytit ani ignorovat), SIGSEGV (neplatný přístup do paměti).
  • Proces si může nastavit vlastní obslužnou rutinu (handler), jinak platí výchozí chování.
  • Hodí se pro řízení, ne pro přenos dat.

Pozn.: signál nejde poslat jen potomkovi. Poslat ho může jakýkoliv proces, pokud na to má práva (stejný uživatel, nebo root) - třeba příkazem kill PID. Na příbuzné procesy je omezená nepojmenovaná roura, viz níže.

3. Roura (pipe)

  • Jednosměrný datový kanál - jeden proces zapisuje, druhý čte. Typu FIFO.
  • Používá se hlavně v UNIXu.
  • Nepojmenovaná (anonymní) - jen mezi příbuznými procesy (rodič a potomek), protože se předává zděděným deskriptorem. Zaniká spolu s procesy.
  • Pojmenovaná (FIFO) - má jméno v souborovém systému, takže ji můžou použít libovolné procesy, i nepříbuzné. Existuje nezávisle na nich.
  • Roura je proudová - nezachovává hranice zpráv, přenáší jen sled bajtů.
  • Klasické použití je zřetězení příkazů v shellu: ls | grep txt | wc -l - standardní výstup jednoho procesu je standardním vstupem druhého.

4. Soket (socket)

  • Aktivní komunikační prostředek - koncový bod obousměrné komunikace.
  • Adresa je rozdělená na adresu a port: adresa určuje počítač, port konkrétní službu / proces na něm.
  • Jediný prostředek z tohoto seznamu, který funguje i mezi různými počítači.
  • Typy podle protokolu:
    • UDP - nespojovaný, nespolehlivý, bez záruky doručení a pořadí, ale rychlý a bez režie. Zprávová komunikace.
    • TCP - spojovaný, spolehlivý, garantované doručení i pořadí. Proudová komunikace.
  • Lokální soket (UNIX domain socket) - v rámci jednoho stroje, adresou je cesta v souborovém systému. Data jdou přes vyrovnávací paměti jádra v RAM, takže je výrazně rychlejší než síťový soket.
  • Typicky se používá v modelu klient - server: server naslouchá na portu, klient se připojuje.

5. Fronta zpráv (message queue)

  • Organizovaný způsob výměny zpráv. Zpráva má hlavičku a tělo - hlavička nese typ / prioritu, tělo vlastní data.
  • Proces zprávu vloží do fronty, příjemce si ji vyzvedne. Nemusí přitom běžet současně - zpráva ve frontě počká.
  • Na rozdíl od roury zachovává hranice zpráv a příjemce si může vybírat podle typu.
  • Čtení může být blokující, pokud ve frontě žádná zpráva není. Stejně tak zápis, když je fronta plná.

6. Sdílená paměť

  • Dva (a víc) procesy sdílí stejný paměťový prostor - jádro jim namapuje stejné rámce do jejich LAP (viz otázka č. 12).
  • Nejrychlejší způsob IPC - po namapování probíhá komunikace obyčejným zápisem a čtením do paměti, jádro už do ní vůbec nezasahuje. Data se nekopírují.
  • Je nutné zajistit synchronizaci, např. pomocí MUTEXu nebo semaforu - jinak vznikne souběh.
  • Nevýhoda: funguje jen v rámci jednoho počítače.
  • V UNIXu shmget/shmat nebo shm_open + mmap, ve Windows file mapping.

7. Vzdálené volání procedur (RPC)

  • Proces zavolá funkci, která se provede na jiném (vzdáleném) stroji. V kódu to přitom vypadá jako obyčejné volání funkce.
  • Přenáší se parametry i návratová hodnota.
  • Obousměrná, zprávově orientovaná komunikace.
  • Zajišťuje to stub (pahýl) na obou stranách: klientský stub zabalí parametry do zprávy (marshalling), pošle ji, serverový stub je rozbalí, zavolá skutečnou funkci a pošle výsledek zpět.
  • Musí řešit rozdílnou reprezentaci dat (endianita) a selhání sítě.
  • Příklad: náročný výpočet provede jiný, výkonnější server.
  • RMI je objektová varianta v Javě. Moderními nástupci jsou gRPC, REST a SOAP.

Problémy IPC

  • Synchronizace - u sdílené paměti si ji procesy musí zajistit samy, jinak vzniká souběh.
  • Uváznutí - dva procesy čekají na zprávu, kterou si mají navzájem poslat.
  • Ztráta zprávy nebo pád účastníka - kdo pošle zprávu procesu, který mezitím skončil, může čekat věčně. Řeší se potvrzováním a timeouty.
  • Bezpečnost - komunikační kanál je potenciální cesta dovnitř procesu, proto mají fronty a sdílené oblasti přístupová práva a přijatá data se musí ověřovat.